import Oidc from "oidc-client";
// import qs from "qs";
import { disableAllUnloadMessage } from "@framework/utilities";
// .well-known/openid-configuration

const CURRENT_BASE_URL = location.origin + location.pathname.split("/").slice(0, -1).join("/");
const OIDC_AUTHORITY = process.env.VUE_APP_OIDC_SERVER;
const CLIENT_ID = "scrm";

const config = {
  // authority: "https://app121419.eapps.dingtalkcloud.com/idp/",
  // authority: "https://192.168.1.36:5001",
  // authority: "https://localhost:5001/",
  authority: OIDC_AUTHORITY,
  client_id: CLIENT_ID,
  redirect_uri: `${CURRENT_BASE_URL}/callback.html`,
  response_type: "code",
  scope: "openid profile api1 offline_access",
  automaticSilentRenew: true, // 自动刷新凭证
  silent_redirect_uri: `${CURRENT_BASE_URL}/silent.html`, // 静默刷新token后的回调地址
  popup_redirect_uri: `${CURRENT_BASE_URL}/popup.html`, // popup 获取token后的回调地址
  // extraQueryParams: corpid ? { corpid } : {},
  post_logout_redirect_uri: `${CURRENT_BASE_URL}/index.html`,
};
const mgr = new Oidc.UserManager(config);
// 监听静默刷新token 异常时的处理
mgr.events.addSilentRenewError(async evt => {
  if (evt.message === "invalid_grant") {
    // 服务端若重启服务了，可能会导致token 失效，此时需要重新获取用户凭据
    await mgr.revokeAccessToken(); // 注销token
    await mgr.removeUser(); // 移除登录数据，这样依赖刷新也有效果
    await mgr.signinSilent(); // 静默登录
  } else if (evt.message === "Network Error") {
    // 网络错误。刷新token 的时候，如果网络错误，会导致静默登录失败，此时需要重新登录
    debugger;
    // await mgr.revokeAccessToken(); // 注销token
    await mgr.removeUser(); // 移除登录数据，这样依赖刷新也有效果
    await mgr.signinRedirect(); // 重新登录
  } else {
    debugger;
  }
});

class OidcError extends Error {
  name = "OidcError";
  oidc = mgr;
  constructor(message?: string) {
    super();
    this.message = message;
  }
}

/** getToken使用 */
export async function OidcGetUser() {
  let user = await mgr.getUser();
  // 判断用户是否存在
  if (user) {
    // 判断凭据是否过期了
    if (user.expired) {
      try {
        mgr.removeUser(); // 删除存储的用户信息
        user = await mgr.signinSilent(); // 尝试静默登录
      } catch (err: any) {
        throw new OidcError(err.message);
      }
    }
    return user;
  } else {
    throw new OidcError("Unauthorized");
  }
}

export async function signinRedirect() {
  try {
    disableAllUnloadMessage(); // 移除所有离开页面的控制操作
    await mgr.signinRedirect({ state: { url: window.location.href } });
  } catch (err: any) {
    throw new OidcError(err.message);
  }
}
export async function signinPopup() {
  await mgr.signinPopup();
}
/** 登出 */
export async function signOut() {
  disableAllUnloadMessage(); // 移除所有离开页面的控制操作
  await mgr.revokeAccessToken(); // 注销token
  await mgr.signoutRedirect();
}
export function getUser() {
  return mgr.getUser();
}
export function silentCallback() {
  return mgr.signinSilentCallback();
}
export async function removeUser() {
  await mgr.revokeAccessToken(); // 注销token
  await mgr.removeUser();
}
